home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BMUG Revelations
/
BMUG Revelations.toast
/
Utilities
/
Random
/
Commodore 64c
/
SOURCE
/
NewHard.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-03-20
|
5KB
|
259 lines
#include <stdio.h>
#include <string.h>
#include "MemoryCalls.h"
#include "Serial.h"
#include "Floppy.h"
#include "FileTypes.h"
#include <Files.h>
/*
* File system interface
*/
enum fsmode {Write, Read, Directory};
struct fs_buffer_info {
short fnum; /* FILE *fd */
FSSpec direntry; /* DIR *dp */
enum fsmode mode;
byte buf[70];
int buflen;
byte *bufp;
int eof;
} fs_info[2];
byte write_fs(unsigned char data, int secondary)
{
long len;
if (fs_info[secondary].mode != Write) return kFloppyError;
if (fs_info[secondary].fd==1)
{
len=1; FSWrite(fs_info[secondary].fnum, &len, &data);
if (len==1) return kSerialOK;
else return kFloppyError;
};
return kFloppyError;
}
int petconv(int c)
{
switch (c & 0xe0)
{
case 0x40:
case 0x60:
return (c ^ 0x20);
}
return (c);
}
void petconvstring(char *c)
{
int i;
for (i = strlen(c) - 1; i >= 0; i--)
c[i] = petconv(c[i]);
}
byte read_fs(unsigned char *data, int secondary)
{
int i;
unsigned short blocks;
struct fs_buffer_info *info = &fs_info[secondary];
long len;
char name[256];
switch (info -> mode)
{
case Write:
return kFloppyError;
case Read:
if (info -> fd)
{
len=1; err=FSRead(fs_info[secondary].fnum, &len, data);
if (err==noErr) return kSerialOK;
else if (err==eofErr) return kSerialEOF;
else return kFloppyError;
}
break;
case Directory:
if (info -> buflen <= 0)
{
myCPB.ioNamePtr=name;
myCPB.ioVRefNum=0;
myCPB.ioFDirIndex=info->index;
myCPB.ioDirID=0;
err=PBGetCatInfo(&myCPB, false);
if (err==noErr)
{
ptr=info->buf; ch=0;
*p++=1; ch++;
*p++=4; ch++;
blocks=myCPB.ioFlLgLen / 256L;
*p++=blocks&256; ch++;
*p++=(blocks>>8)&256; ch++;
for (j = 0; blocks > 9; j++) blocks /= 10;
i = 4 - j;
if (i < 0) i=0;
while (i-- > 0) { *p++ = ' '; ch++; }
*p++ = '"'; ch++;
for (i = 0; i < name[0]; i++) { *p++ = petconv([i+1]); ch++; }
*p++ = '"'; ch++;
*p++ = '\0'; ch++;
info -> buflen = ch;
}
else
{
info -> buf[0] = 0;
info -> buf[1] = 0;
info -> buf[2] = 0;
info -> buflen = 3;
info -> eof++;
}
info -> bufp = info -> buf;
}
*data = *info -> bufp++;
info -> buflen--;
return kSerialOK;
}
return kFloppyError;
}
byte open_fs(char *name, int length, int secondary)
{
FILE *fd;
DIR *dp;
char tmp[256], *p;
if (fs_info[secondary].fd) return kFloppyError;
/*
* Support only load / save
*/
if (secondary < 0 || secondary >= 2) return kFloppyError;
memcpy(tmp, name, length);
tmp[length] = 0;
petconvstring(tmp);
if (*tmp == '$') {
if (secondary != 0)
return kFloppyError;
if (tmp[1]) {
if (!(dp = opendir((char *)tmp + 1))) {
for (p = tmp; *p; p++)
if (isupper(*p))
*p = tolower(*p);
if (!(dp = opendir((char *)tmp + 1)))
return kFloppyError;
}
strcpy(fs_info[secondary].dir, tmp + 1);
} else {
if (!(dp = opendir(".")))
return kFloppyError;
strcpy(fs_info[secondary].dir, ".");
}
fs_info[secondary].mode = Directory;
fs_info[secondary].dp = dp;
fs_info[secondary].eof = 0;
fs_info[secondary].buflen = 2;
fs_info[secondary].bufp = fs_info[secondary].buf;
fs_info[secondary].buf[0] = 0;
fs_info[secondary].buf[1] = 4;
} else {
fs_info[secondary].mode = (secondary == 1 ? Write : Read);
fd = fopen(tmp, fs_info[secondary].mode ? "r" : "w+");
if (!fd) {
for (p = tmp; *p; p++)
if (isupper(*p))
*p = tolower(*p);
fd = fopen(tmp, fs_info[secondary].mode ? "r" : "w+");
if (!fd)
return kFloppyError;
}
fs_info[secondary].fd = fd;
}
return kSerialOK;
}
byte close_fs(int secondary)
{
switch (fs_info[secondary].mode) {
case Write:
case Read:
if (!fs_info[secondary].fd)
return FLOPPY_ERROR;
fclose(fs_info[secondary].fd);
fs_info[secondary].fd = NULL;
break;
case Directory:
if (!fs_info[secondary].dp)
return FLOPPY_ERROR;
closedir(fs_info[secondary].dp);
fs_info[secondary].dp = NULL;
break;
}
return FLOPPY_COMMAND_OK;
}
HFileInfo myCPB;
char fname[256];
short totalFiles, totalDirs;
main()
myCPB.ioNamePtr=(unsigned char *)fname;
myCPB.ioVRefNum=0;
EnumCatalog(fsRtDirID);
EnumCatalog(long searchId)
{
short index=1;
OSErr err;
do
{
myCPB.ioDFirIndex=index;
myCPB.ioDirID=dirIdToSearch;
err=PBGetCatInfo(&myCPB, false);
if (err=noErr)
{
if (((myCPB.ioFlAttrib>>4)&0x01)==1)
{
dir
}
else
{
print name;
}
index++;
}
} while (err!=fnfErr);
}